LIS 길이 구하기
이분탐색
C++
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
int N = 6;
int arr[6] = {1, 2, 4, 3, 5, 6}
int dp[6];
int max_length = 0;
for(int i = 0; i<N; i++) {
int index = lower_bound(arr, arr + max_length, arr[i]) - arr;
dp[index] = arr[i];
if(max_length == index) {
max_length++;
}
}
cout << max_length;
}
Python
import bisect
x = int(input())
arr = list(map(int, input().split()))
dp = [arr[0]]
for i in range(x):
if arr[i] > dp[-1]:
dp.append(arr[i])
continue
index = bisect.bisect_left(dp, arr[i])
dp[index] = arr[i]
print(len(dp))
LIS의 원소 구하기
이분탐색
#include <iostream>
#include <vector>
#include <algorithm>
int N = 6;
int arr[6] = {1, 2, 4, 3, 5, 6}
int dp[6];
int dp_idx[6];
void print(int lis_index, int index) {
if(lis_index < 0 || index < 0) return;
if(dp_idx[index] == lis_index) {
print(lis_index - 1, index - 1);
cout << arr[index] << " ";
}
else print(lis_index - 1, index);
}
int main() {
int max_length = 0;
for(int i = 0; i<N; i++) {
int index = lower_bound(arr, arr + max_length, arr[i]) - arr;
dp[index] = arr[i];
dp_idx[i] = index;
if(max_length == index) {
max_length++;
}
}
cout << max_length;
print(N-1, max_length - 1);
vector<int> result;
for (int i = N; i >= 1; i--) {
if (dp_idx[i] == max_length - 1) {
result.push_back(arr[i]);
max_length--;
}
}
for (int i = result.size() - 1; i >= 0; i--) {
cout << result[i] << ' ';
}
}
참고